package org.fixies.spreadsheet.interpreter;

import org.fixies.utils.Validator;

/**
 * SheetContext抽象クラス
 *
 * @author Kawasaki
 */
public abstract class AbstractSheetContext implements SheetContext {

    /**
     * セルコメントであるか判定する
     *
     * @param cellValue セルの値
     * @return 判定結果
     */
    public static boolean isCommentCell(String cellValue) {
        return COMMENT_CELL_PATTERN.matcher(cellValue).matches();
    }

    /**
     * 空行をスキップする。
     */
    public String[] currentSkippingEmptyRow() {
        String[] line = current();
        return skipEmptyRow(line);
    }

    @Override
    public String[] nextSkippingEmptyRow() {
        String[] line = next();
        return skipEmptyRow(line);
    }

    private String[] skipEmptyRow(String[] line) {
        while (line != null && isBlankRow(line)) {
            line = next();
        }
        return line;
    }

    /**
     * 空行であるか判定する。
     *
     * @param line 判定対象となる行
     * @return 判定結果
     */
    protected final boolean isBlankRow(String[] line) {
        if (line.length == 0) return true;
        for (String cell : line) {
            if (!isBlankCell(cell)) {
                return false;
            }
        }
        return true;
    }

    /**
     * 空のセルであるか判定する。
     *
     * @param cellValue セルの値
     * @return 判定結果
     */
    private boolean isBlankCell(String cellValue) {
        return Validator.isNullOrEmpty(cellValue);
    }
}
